package com.yytek.tddb.api;

/**
 *  时序性数据库TdEngine服务
 */

import com.yytek.common.core.constant.ServiceNameConstants;
import com.yytek.common.core.domain.R;

import com.yytek.tddb.api.domain.SelectDto;
import com.yytek.tddb.api.domain.SuperTableDto;
import com.yytek.tddb.api.domain.TableDto;
//import com.yytek.tddb.api.factory.RemoteTdEngineFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@FeignClient(contextId = "remoteTdEngineService", value = ServiceNameConstants.TDENGINE_SERVICE)
public interface RemoteTdEngineService {

    /**
     * @param databaseName 数据库名称
     * @return R
     * @MethodDescription 创建tdEngine数据库
     */
    @PostMapping("/dataOperation/createDb")
    R<?> createDataBase(@RequestParam("databaseName") String databaseName);

    /**
     * @param superTableDto 创建超级表需要的入参的实体类
     * @return R
     * @MethodDescription 创建超级表
     */
    @PostMapping("/dataOperation/createSTb")
    R<?> createSuperTable(@Validated @RequestBody SuperTableDto superTableDto);

    /**
     *@MethodDescription 创建超级表的子表
     *@param tableDto 创建超级表的子表需要的入参的实体类
     *@return R
     */
    @PostMapping("/dataOperation/createTb")
    R<?> createTable(@Validated @RequestBody TableDto tableDto);

    /**
     *@MethodDescription 插入数据
     *@param tableDto 插入数据需要的入参的实体类
     *@return R
     */
    @PostMapping("/dataOperation/insertData")
    R<?> insertData(@Validated @RequestBody TableDto tableDto);

    /**
     *@MethodDescription 批量插入数据
     *@param tableDto 插入数据需要的入参的实体类
     *@return R
     */
    @PostMapping("/dataOperation/insertListData")
    R<?> insertListData(@RequestBody List<TableDto> tableDto);

    @PostMapping("/dataOperation/addColumnInStb")
    R<?> addColumnInStb(@RequestBody SuperTableDto superTableDto);

    /**
     * 根据查询条件查询数据库
     * @param selectDto 查询的实体
     * @return
     */
    @PostMapping("/dataOperation/getDataByTimestamp")
    R<?> getDataByTimestamp(@Validated @RequestBody SelectDto selectDto);

    /**
     * 删除子表
     * @param tableName
     * @return
     */
    @PostMapping("/dataOperation/deleteTb")
    R<?> deleteTable(@RequestParam("tableName") String tableName);

    /**
     * 获取最后一条实时数据
     * @param selectDto
     * @return
     */
    @PostMapping("/dataOperation/getDataLastOne")
    R<?> getDataLastOne( @Validated @RequestBody SelectDto selectDto);
}
